printing: Don't show duplicate printers
authorMarek Kasik <mkasik@redhat.com>
Wed, 30 Aug 2017 15:56:00 +0000 (17:56 +0200)
committerMarek Kasik <mkasik@redhat.com>
Mon, 9 Oct 2017 15:54:50 +0000 (17:54 +0200)
Check UUID for printers obtained via DNSSD whether
they are already installed on local CUPS server.
Don't show such printers.

Not all printers published via DNSSD have UUID entry though.

https://bugzilla.gnome.org/show_bug.cgi?id=786794

modules/printbackends/cups/gtkprintbackendcups.c
modules/printbackends/cups/gtkprintercups.c
modules/printbackends/cups/gtkprintercups.h

index 9d23bc10113d3ef4f2d7cf1e6ff7fa3f8b385642..abc5f841c62d1d98036bf0bf129fb6586a8600f1 100644 (file)
@@ -1899,7 +1899,8 @@ static const char * const printer_attrs[] =
     "ipp-versions-supported",
     "multiple-document-handling-supported",
     "copies-supported",
-    "number-up-supported"
+    "number-up-supported",
+    "device-uri"
   };
 
 /* Attributes we're interested in for printers without PPD */
@@ -1996,11 +1997,13 @@ typedef struct
   int       number_of_covers;
   gchar    *output_bin_default;
   GList    *output_bin_supported;
+  gchar    *original_device_uri;
 } PrinterSetupInfo;
 
 static void
 printer_setup_info_free (PrinterSetupInfo *info)
 {
+  g_free (info->original_device_uri);
   g_free (info->state_msg);
   g_strfreev (info->covers);
   g_slice_free (PrinterSetupInfo, info);
@@ -2376,6 +2379,10 @@ cups_printer_handle_attribute (GtkPrintBackendCups *cups_backend,
 
       info->output_bin_supported = g_list_reverse (info->output_bin_supported);
     }
+  else if (g_strcmp0 (ippGetName (attr), "device-uri") == 0)
+    {
+      info->original_device_uri = g_strdup (ippGetString (attr, 0, NULL));
+    }
   else
     {
       GTK_NOTE (PRINTING,
@@ -2464,6 +2471,7 @@ cups_create_printer (GtkPrintBackendCups *cups_backend,
 
   cups_printer->default_cover_before = g_strdup (info->default_cover_before);
   cups_printer->default_cover_after = g_strdup (info->default_cover_after);
+  cups_printer->original_device_uri = g_strdup (info->original_device_uri);
 
   if (info->default_number_up > 0)
     cups_printer->default_number_up = info->default_number_up;
@@ -2830,9 +2838,54 @@ typedef struct
   guint                printer_state;
   gchar               *type;
   gchar               *domain;
+  gchar               *UUID;
   GtkPrintBackendCups *backend;
 } AvahiConnectionTestData;
 
+static GtkPrinter *
+find_printer_by_uuid (GtkPrintBackendCups *backend,
+                      const gchar         *UUID)
+{
+  GtkPrinterCups *printer;
+  GtkPrinter     *result = NULL;
+  GList          *printers;
+  GList          *iter;
+  gchar          *printer_uuid;
+
+  printers = gtk_print_backend_get_printer_list (GTK_PRINT_BACKEND (backend));
+  for (iter = printers; iter != NULL; iter = iter->next)
+    {
+      printer = GTK_PRINTER_CUPS (iter->data);
+      if (printer->original_device_uri != NULL)
+        {
+          printer_uuid = g_strrstr (printer->original_device_uri, "uuid=");
+          if (printer_uuid != NULL && strlen (printer_uuid) >= 41)
+            {
+              printer_uuid += 5;
+              printer_uuid = g_strndup (printer_uuid, 36);
+
+#if GLIB_CHECK_VERSION(2, 52, 0)
+              if (g_uuid_string_is_valid (printer_uuid))
+#endif
+                {
+                  if (g_strcmp0 (printer_uuid, UUID) == 0)
+                    {
+                      result = GTK_PRINTER (printer);
+                      g_free (printer_uuid);
+                      break;
+                    }
+                }
+
+              g_free (printer_uuid);
+            }
+        }
+    }
+
+  g_list_free (printers);
+
+  return result;
+}
+
 /*
  *  Create new GtkPrinter from informations included in TXT records.
  */
@@ -2878,6 +2931,10 @@ create_cups_printer_from_avahi_data (AvahiConnectionTestData *data)
   set_info_state_message (info);
 
   printer = gtk_print_backend_find_printer (GTK_PRINT_BACKEND (data->backend), data->printer_name);
+
+  if (printer == NULL && data->UUID != NULL)
+    printer = find_printer_by_uuid (data->backend, data->UUID);
+
   if (printer == NULL)
     {
       printer = cups_create_printer (data->backend, info);
@@ -3080,6 +3137,11 @@ avahi_service_resolver_cb (GObject      *source_object,
                   if (data->printer_state != 0 || endptr != value)
                     data->got_printer_state = TRUE;
                 }
+              else if (g_strcmp0 (key, "UUID") == 0)
+                {
+                  if (*value != '\0')
+                    data->UUID = g_strdup (value);
+                }
 
               g_clear_pointer (&key, g_free);
               g_clear_pointer (&value, g_free);
index 4a94cbd09d72fda7e4c17813843fb41024dc7d02..068aba74c5d023724d501361bc52b08455f0f18c 100644 (file)
@@ -100,6 +100,7 @@ static void
 gtk_printer_cups_init (GtkPrinterCups *printer)
 {
   printer->device_uri = NULL;
+  printer->original_device_uri = NULL;
   printer->printer_uri = NULL;
   printer->state = 0;
   printer->hostname = NULL;
@@ -151,6 +152,7 @@ gtk_printer_cups_finalize (GObject *object)
   printer = GTK_PRINTER_CUPS (object);
 
   g_free (printer->device_uri);
+  g_free (printer->original_device_uri);
   g_free (printer->printer_uri);
   g_free (printer->hostname);
   g_free (printer->ppd_name);
index 837035a9c643855d2307696daf69e0a4bb08df43..f26bbab677609c72b1443481feee07cb1e6697c1 100644 (file)
@@ -48,6 +48,7 @@ struct _GtkPrinterCups
   GtkPrinter parent_instance;
 
   gchar *device_uri;
+  gchar *original_device_uri;
   gchar *printer_uri;
   gchar *hostname;
   gint port;